// AC
#include <bits/stdc++.h>
#define MAX_CHORDS 200010 // 更清晰的常量命名
using namespace std;

struct Chord {
  int start;              // 弦的起点
  int end;                // 弦的终点
} chords[MAX_CHORDS * 2]; // 每个弦需要存储两个端点

int n, idx, f[MAX_CHORDS * 2], maxLength;

int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    int l, r;
    cin >> l >> r;
    if (l > r)
      swap(l, r); // 确保起点小于终点

    // 存储弦的两个表示方式：
    // 1. 原始弦 [l, r]
    // 2. 环绕表示 [r, l+2n] 用于处理环形情况
    chords[++idx] = {l, r};
    chords[++idx] = {r, l + 2 * n};
  }

  // 按起点排序所有弦
  sort(chords + 1, chords + 1 + idx,
       [](Chord a, Chord b) { return a.start < b.start; });
  // lambda 表达式 : [外部变量列表](参数)->返回类型{ body}

  // 初始化DP数组
  f[0] = INT_MAX;

  // 使用贪心+二分查找求最长不重叠弦序列
  for (int i = 1; i <= idx; i++) {
    int k = chords[i].end;
    if (k < f[maxLength]) {
      f[++maxLength] = k;
    } else {
      // 找到第一个大于等于当前弦终点的位置进行替换
      auto it = lower_bound(f + 1, f + 1 + maxLength, k,
                            [](int a, int b) { return a >= b; });
      *it = k;
    }
  }

  cout << maxLength << "\n";
  return 0;
}